home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / misc / emu / prlink_amiga.lha / prlink-0.8.0a / src / prrfile.c < prev    next >
C/C++ Source or Header  |  1995-04-17  |  6KB  |  285 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. #include "prtrans.h"
  6.  
  7. #if !defined(__MAIN_C__)
  8. #define main    main_prrfile
  9. #endif
  10.  
  11. #if defined(__MAIN_C__)
  12. unsigned char buffer[256];
  13. #else
  14. extern unsigned char buffer[];
  15. #endif
  16.  
  17. int main(int argc, char **argv);
  18.  
  19. void
  20. printdir(unsigned char *p, int length, FILE *file)
  21. {
  22.   /*
  23.    * State: 0,1: ignore load address
  24.    *        2,3: line link
  25.    *        4,5: line number
  26.    *        6  : line contents
  27.    *        7  : end
  28.    */
  29.   static int state = 0;
  30.   static int lineno;
  31.  
  32.   while (length > 0) {
  33.     switch(state) {
  34.     case 0:
  35.     case 1:
  36.       state++;
  37.       break;
  38.     case 2:    /* ignore low byte of link */
  39.       state++;
  40.       break;
  41.     case 3:
  42.       state++;
  43.       if (*p == 0) {
  44.     state = 7;
  45.       }
  46.       break;
  47.     case 4:
  48.       state++;
  49.       lineno = *p;
  50.       break;
  51.     case 5:
  52.       state++;
  53.       lineno += 256 * *p;
  54.       fprintf(file, " %d ", lineno);
  55.       break;
  56.     case 6:
  57.       if (*p == 0) {
  58.     state = 2;
  59.     putc('\n', file);
  60.       } else {
  61.     static char tmp[2];
  62.     tmp[0] = *p;
  63.     petscii2ascii(tmp);
  64.     putc(tmp[0], file);
  65.       }
  66.       break;
  67.     }
  68.     length--;
  69.     p++;
  70.   }
  71. }
  72.  
  73. int
  74. main(int argc, char **argv)
  75. {
  76.   FILE *file = stdout;
  77.   int device = 8;
  78.   int byte;
  79.   char **parameters = argv;
  80.   char *remotefile;
  81.   char *localfile;
  82.   char *portspecified = NULL;
  83.   char *prg = "prrfile.prg"; /* loader program file name */
  84.   int specified_localfile = 0;
  85.   baseaddr = portaddr[DEFAULT_PORT];
  86.  
  87.   while (*++parameters && **parameters == '-') { /* check for options */
  88.     if (parameters[0][1] == '-') { /* "--" ends options */
  89.       parameters++;
  90.       break;
  91.     }
  92.  
  93.     switch (parameters[0][1]) {
  94.     case 'd':
  95.       device = strtoul (*++parameters, NULL, 0);
  96.  
  97.       if (device > 15) {
  98.     fprintf (stderr, "%s: Illegal device number specified.\n", *argv);
  99.     return 1;
  100.       }
  101.  
  102.       break;
  103.  
  104.     case 'l':
  105.       prg = *++parameters;
  106.       break;
  107.  
  108.     case 'p':
  109.       baseaddr = strtoul (*++parameters, NULL, 16);
  110.  
  111.       if (baseaddr > 3) {
  112.     fprintf (stderr, "%s: The printer port number must be between 0 and 3.\n",
  113.              *argv);
  114.     return 1;
  115.       }
  116.  
  117.       portspecified = *parameters;
  118.       baseaddr = portaddr[baseaddr];
  119.       break;
  120.  
  121.     case '?':
  122.     case 'h':
  123.     Usage:
  124.       fprintf (stderr, "%s: Dumps a file accessible from a remote "
  125.                "computer to a file.\n\n", *argv);
  126.       fprintf (stderr, "Usage: %s [options] filename [local filename]\n",
  127.                *argv);
  128.       fprintf (stderr, "Options:\n\t"
  129.              "-d device\t"
  130.                  "Specify the device number (0-15)\n\t"
  131.              "-l filename\t"
  132.                  "Specify the filename of the client program\n\t"
  133.              "-p port\t"
  134.                  "Specify the printer port (0 to 3)\n");
  135.       fprintf (stderr, "The filename can start with a $, in which case it is\n"
  136.                "printed as a directory, unless a local name is given.\n"
  137.                "The remote filename is converted to PETSCII.\n"
  138.                "The default local file name has / characters converted to -.\n");
  139.  
  140.       return 1;
  141.  
  142.     default:
  143.       fprintf (stderr, "%s: Illegal option `%s'.\n", *argv, *parameters);
  144.       goto Usage;
  145.     }
  146.   }
  147.  
  148.   if (!*parameters) goto Usage;
  149.  
  150.   localfile = *parameters++;
  151.   remotefile = strdup(localfile);
  152.   ascii2petscii(remotefile);
  153.   {
  154.     char *bad;
  155.     while ((bad = strpbrk(localfile, "/")) != NULL)
  156.       *bad = '-';
  157.   }
  158.  
  159.   if (*parameters) {
  160.     localfile = *parameters++;
  161.     specified_localfile = 1;
  162.   }
  163.  
  164.   if (!specified_localfile && localfile[1] == ':') {
  165.     localfile += 2;
  166.   }
  167.   if (remotefile[0] == '$' && !specified_localfile) {
  168.     file = stdout;
  169.     localfile = "$";
  170.   } else if (strcmp(localfile, "-") == 0) {
  171.     file = stdout;
  172.   } else if (!(file = fopen(localfile, "wb"))) {
  173.     fprintf (stderr, "%s: Could not open the file `%s'.\n", *argv,
  174.                localfile);
  175.     return 1;
  176.   }
  177.  
  178.   {
  179.     int addr;
  180.  
  181.     FILE *f = fopen(prg, "r");
  182.     if (f == NULL) {
  183.       fprintf(stderr, "%s: Cannot find %s to download\n", *argv, prg);
  184.       return 1;
  185.     }
  186.  
  187.     addr = fgetc(f);
  188.     addr |= fgetc(f) << 8;
  189.     fclose(f);
  190.  
  191. #if defined(__MAIN_C__)
  192.     {
  193.       char cmd[80];
  194.       sprintf(cmd, "prload -j %x ", addr);
  195.  
  196.       if (portspecified) {
  197.         strcat (cmd, "-p ");
  198.         strcat (cmd, portspecified);
  199.         strcat (cmd, " ");
  200.       }
  201.  
  202.       strcat (cmd, prg);
  203.   
  204.       fprintf(stderr, "%s\n", cmd);
  205.       system(cmd);
  206.     }
  207. #else
  208.     {
  209.       char saddr[10];
  210.       sprintf (saddr, "%x", addr);
  211.       vmain (main_prload, 4, "prload", "-j", saddr,
  212.              portspecified ? "-p", portspecified, prg, NULL : prg, NULL);
  213.     }
  214. #endif
  215.   }
  216.  
  217.   if (prinit()) {
  218.     fprintf (stderr, "%s: Could not get the I/O permissions.\n", *argv);
  219.     return 1;
  220.   }
  221.  
  222.   if (wait_input ()) {
  223.     fprintf (stderr, "%s: not ready to transfer\n", *argv);
  224.     return 6;
  225.   }
  226.   else
  227.     fprintf (stderr, "%s: ok to transfer\n", *argv);
  228.  
  229.   byte = strlen(remotefile);
  230.   output(byte);
  231.   send(remotefile, byte);
  232.   output(device);
  233.  
  234.   if ((byte = wait_input ()) != 0) {
  235.     fprintf (stderr, "%s: file error %d\n", *argv, byte);
  236.     return 7;
  237.   }
  238.   fprintf(stderr, "reading %s to %s...\n", remotefile, localfile);
  239.  
  240.   /* loop to get all file blocks */
  241.   for (;;) {
  242.     int length;
  243.  
  244.     for (;;) {
  245.       int chksum;
  246.       int i;
  247.  
  248.       length = input();
  249.       if (length == 0)
  250.     break;          /* end of file */
  251.  
  252.       receive(buffer, length + 1);
  253.  
  254.       chksum = 0;
  255.       for (i = 0; i < length; i++) {
  256.     chksum += buffer[1 + i];
  257.       }
  258.  
  259.       if ((chksum & 0xFF) == buffer[0]) {
  260.     output(0x80);
  261.     break;
  262.       }
  263.       fprintf(stderr, "checksum error "
  264.               "(received %02x, calculated %02x), retrying\n",
  265.               buffer[0], (chksum & 0xFF));
  266.       output(0x81);
  267.     }
  268.     if (length == 0)
  269.       break;
  270.     if (localfile[0] == '$') {
  271.       printdir(buffer + 1, length, file);
  272.     } else {
  273.       fwrite (buffer + 1, 1, length, file);
  274.     }
  275.   }
  276.  
  277.   fclose(file);
  278.  
  279.   output(0);    /* terminate remote side */
  280.  
  281.   prclose ();
  282.  
  283.   return 0;
  284. }
  285.